home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-12 | 6.4 KB | 161 lines | [TEXT/CCL2] |
- ;
- ; find-method-dialog.lisp
- ;
- ; Masaya UEDA
- ; ueda@shpcs.sharp.co.jp
-
- (defclass alist-dialog-item (sequence-dialog-item)
- ((alist :initform nil :accessor alist)))
-
- (defmethod (setf alist) :after ((l list) (adi alist-dialog-item))
- (set-table-sequence adi (mapcar 'car l)))
-
- ; ---
-
- (defclass mini-buffer-mixin ()
- ((mini-buffer :initform (make-instance 'mini-buffer)
- :accessor view-mini-buffer)
- (mini-buffer-dialog-item :initarg :window-mini-buffer-dialog-item
- :accessor window-mini-buffer-dialog-item))
- (:default-initargs :window-mini-buffer-dialog-item nil)
- (:documentation "This class need to be mixed with class window or it's descendants"))
-
- (defclass window-with-mini-buffer (mini-buffer-mixin window) ())
-
- (defclass dialog-with-mini-buffer (mini-buffer-mixin dialog) ())
-
- (defmethod initialize-instance :after ((window mini-buffer-mixin)
- &rest initargs
- &key window-mini-buffer-dialog-item)
- (declare (dynamic-extent initargs)
- (ignore initargs))
- (if window-mini-buffer-dialog-item
- (add-subviews window window-mini-buffer-dialog-item)))
-
- (defmethod mini-buffer-update ((window mini-buffer-mixin))
- (let ((mb (view-mini-buffer window)))
- (set-dialog-item-text (window-mini-buffer-dialog-item window)
- (mini-buffer-string mb))
- (setf (slot-value mb 'ccl::string-changed) nil)))
-
- (defmethod mini-buffer-update ((fdi fred-dialog-item))
- (let ((vw (view-window fdi)))
- (if (typep vw 'mini-buffer-mixin)
- (mini-buffer-update vw))))
-
- (if (find :COMPLETION *modules* :test #'string=)
- (defmethod ccl::display-mini-buffer-completion ((window mini-buffer-mixin))
- (let ((fdi (current-key-handler window)))
- (and *completion* fdi
- (set-dialog-item-text (window-mini-buffer-dialog-item window)
- ccl::*last-completion-word-displayed*)))))
-
- (defmethod fred-update ((window mini-buffer-mixin))
- (let ((ckh (current-key-handler window)))
- (typep ckh 'fred-mixin)
- (fred-update ckh)))
-
- (defmethod set-mini-buffer ((window mini-buffer-mixin) string
- &rest format-args)
- (declare (dynamic-extent format-args))
- (let ((ckh (current-key-handler window)))
- (if (typep ckh 'fred-mixin)
- (apply #'set-mini-buffer ckh string format-args))))
-
- (defmethod window-eval-selection ((window mini-buffer-mixin)
- &optional (evalp nil evalp?))
- (let ((ckh (current-key-handler window)))
- (if (typep ckh 'fred-mixin)
- (if evalp?
- (window-eval-selection ckh evalp)
- (window-eval-selection ckh)))))
-
- (defmethod deselect-all-cells ((tdi table-dialog-item))
- (dolist (cell (selected-cells tdi))
- (cell-deselect tdi cell)))
-
- ; ---
-
- (defun make-find-method-dialog ()
- (labels ((find (item)
- (let ((f (fboundp
- (read-from-string
- (dialog-item-text
- (find-named-sibling item 'etdi))
- nil)))
- (adi (find-named-sibling item 'adi)))
- (typecase f
- (generic-function
- (deselect-all-cells adi)
- (setf (alist adi)
- (mapcar #'(lambda (m)
- (cons (list (method-qualifiers m)
- (mapcar #'(lambda (ms)
- (if (typep ms 'class)
- (class-name ms)
- ms))
- (method-specializers m)))
- m))
- (generic-function-methods f))))
- (otherwise
- (setf (alist adi) nil))))
- (dialog-item-disable (find-named-sibling item 'remove)))
- (remove (item)
- (let* ((adi (find-named-sibling item 'adi))
- (alist (alist adi)) method)
- (dolist (cell (selected-cells adi))
- (setq method (cdr (nth (cell-to-index adi cell) alist)))
- (remove-method (method-generic-function method) method)))
- (find item))
- (adia (item &aux (sc (selected-cells item)))
- (cond (sc (dialog-item-enable (find-named-sibling item 'remove))
- (if (double-click-p)
- (dolist (cell sc)
- (print (cdr (nth (cell-to-index item cell) (alist item)))))))
- (t (dialog-item-disable (find-named-sibling item 'remove))))))
- (make-instance 'dialog-with-mini-buffer
- :window-type :document
- :window-title "Find Method Dialog"
- :view-position '(:bottom 10)
- :view-size #@(300 150)
- :view-font '("osaka" 12 :srcor :plain)
- :window-mini-buffer-dialog-item
- (make-dialog-item 'static-text-dialog-item
- #@(4 124) #@(152 24) "" 'nil
- :view-nick-name 'stdi
- :view-font '("monaco" 9 :srcor :plain))
- :view-subviews
- (list (make-dialog-item 'editable-text-dialog-item
- #@(5 5) #@(290 14) "" 'nil
- :view-nick-name 'etdi
- :view-font '("monaco" 9 :srcor :plain)
- :allow-returns nil)
- (make-dialog-item 'button-dialog-item
- #@(234 128) #@(61 16) "remove" #'remove
- :view-nick-name 'remove
- :view-font '("geneva" 12 :srcor :plain)
- :default-button nil
- :dialog-item-enabled-p nil)
- (make-dialog-item 'button-dialog-item
- #@(164 128) #@(61 16) "find" #'find
- :view-nick-name 'find
- :view-font '("geneva" 12 :srcor :plain)
- :default-button t)
- (make-dialog-item 'alist-dialog-item
- #@(3 25) #@(294 96) "untitled" #'adia
- :view-nick-name 'adi
- :view-font '("monaco" 9 :srcor :plain)
- :cell-size #@(294 12)
- :selection-type :disjoint
- :table-hscrollp nil
- :table-vscrollp t
- :table-sequence nil)))))
-
- (make-find-method-dialog)
-
- #|
- (add-menu-items (find-menu "Edit")
- (make-instance 'menu-item
- :menu-item-title "Find Method..."
- :menu-item-action 'make-find-method-dialog))
- |#